package cz.uhk.ppro.services;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;

import org.springframework.transaction.annotation.Transactional;

import cz.uhk.ppro.entities.Dodavatel;
import cz.uhk.ppro.entities.KontaktniOsoba;

/***
 * 
 * Db implementace práce s dodavatelem a kontaktními osobami
 *
 */

@Transactional
public class DodavatelDbService {
	@PersistenceContext
	EntityManager em;
	
	public void pridejKontaktniOsobu(String titul, String jmeno, String prijmeni, String telefon, String fax, String email, Dodavatel dod){
		/**
		 * vytvoří kontaktní osobu a přiřadí ji k dodavateli
		 * parametry údaje nově vytvořené osoby a dodavatel ke kterému bude patřit
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			KontaktniOsoba osoba = new KontaktniOsoba();
			osoba.setEmail(email);
			osoba.setFax(fax);
			osoba.setJmeno(jmeno);
			osoba.setPrijmeni(prijmeni);
			osoba.setTelefon(telefon);
			osoba.setTitul(titul);
			osoba.setDodavatel(dod);
			em.persist(osoba);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void upravKontaktniOsobu(int id, String titul, String jmeno, String prijmeni, String telefon, String fax, String email){
		/**
		 * upraví kontaktní osobu
		 * parametr id kontaktní osoby k úpravě a její údaje
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			KontaktniOsoba osoba = em.find(KontaktniOsoba.class, id);
			osoba.setEmail(email);
			osoba.setFax(fax);
			osoba.setJmeno(jmeno);
			osoba.setPrijmeni(prijmeni);
			osoba.setTelefon(telefon);
			osoba.setTitul(titul);
			em.merge(osoba);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void pridejDodavatele(String nazevFirmy,String mesto, String ulice, String cp, String psc){
		/**
		 * přidá dodavatele
		 * parametry údaje o dodavateli
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			Dodavatel dod = new Dodavatel();
			dod.setCisloPopisne(cp);
			dod.setMesto(mesto);
			dod.setNazevFirmy(nazevFirmy);
			dod.setPsc(psc);
			dod.setUlice(ulice);
			em.persist(dod);
		em.getTransaction().commit();
		em.close();
		emf.close();
		}
	
	public void upravDodavatele(Dodavatel dod, String nazevFirmy,String mesto, String ulice, String cp, String psc){
		/**
		 * upraví dodavatele
		 * parametry dodavatel k upravení + údaje o dodavateli
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			dod.setCisloPopisne(cp);
			dod.setMesto(mesto);
			dod.setNazevFirmy(nazevFirmy);
			dod.setPsc(psc);
			dod.setUlice(ulice);
			em.merge(dod);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void smazKontaktniOsobu (int id){
		/**
		 * Smaže kontakt z db
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			KontaktniOsoba osoba = em.find(KontaktniOsoba.class, id);
			em.remove(osoba);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public void smazDodavatele (int id){
		/**
		 * Smaže dodavatele z db
		 */
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("stavostroj");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
			@SuppressWarnings("unchecked")
			List<KontaktniOsoba> ko = em.createQuery("from KontaktniOsoba where idDodavatele = ?").setParameter(1, id).getResultList();
			for (KontaktniOsoba k: ko){
				em.remove(k);
			}
			Dodavatel dod = em.find(Dodavatel.class, id);
			em.remove(dod);
		em.getTransaction().commit();
		em.close();
		emf.close();
	}
	
	public List<Dodavatel> vypis (){
		/**
		 * Vypíše všechny dodavatele
		 */
		@SuppressWarnings("unchecked")
		List<Dodavatel> dodavatele = em.createQuery("from Dodavatel").getResultList();
		return dodavatele;
	}
	
	public Dodavatel vratDodavatele (int id) {
		/**
		 * Vrátí dodavatele s daným id
		 */
		Dodavatel dodavatel = em.find(Dodavatel.class, id);
		return dodavatel;
	}
	
	public KontaktniOsoba vratKontaktniOsobu (int id) {
		/**
		 * Vrátí kontaktní osobu s daným id
		 */
		KontaktniOsoba kontakt = em.find(KontaktniOsoba.class, id);
		return kontakt;
	}
	public Dodavatel vratDodavatele(String nazevFirmy){
		Dodavatel dodavatel = (Dodavatel)(em.createQuery("from Dodavatel where nazevFirmy = ?").setParameter(1, nazevFirmy).getSingleResult());
		return dodavatel;
	}
}
